#if defined (_MSC_VER) && (_MSC_VER >= 1020)
#pragma once
#endif

#ifndef JETBYTE_TOOLS_WIN32_CRITICAL_SECTION_INCLUDED__
#define JETBYTE_TOOLS_WIN32_CRITICAL_SECTION_INCLUDED__

///////////////////////////////////////////////////////////////////////////////

#ifndef _WINDOWS_
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#undef WIN32_LEAN_AND_MEAN
#endif

///////////////////////////////////////////////////////////////////////////////
// Namespace: OldDreamTools::Win32
///////////////////////////////////////////////////////////////////////////////

namespace OldDreamTools {
namespace Win32 {

///////////////////////////////////////////////////////////////////////////////
// CCriticalSection
///////////////////////////////////////////////////////////////////////////////

class CCriticalSection
{
   public :

      class Owner
      {
         public:

            explicit Owner(
               CCriticalSection &crit);

            ~Owner();

         private :

            CCriticalSection &m_crit;

            // No copies do not implement
            Owner(const Owner &rhs);
            Owner &operator=(const Owner &rhs);
      };

      CCriticalSection();

      ~CCriticalSection();

#if(_WIN32_WINNT >= 0x0400)
      bool TryEnter();
#endif
      void Enter();

      void Leave();

   private :

      CRITICAL_SECTION m_crit;

      // No copies do not implement
      CCriticalSection(const CCriticalSection &rhs);
      CCriticalSection &operator=(const CCriticalSection &rhs);
};

///////////////////////////////////////////////////////////////////////////////
// Namespace: OldDreamTools::Win32
///////////////////////////////////////////////////////////////////////////////

} // End of namespace Win32
} // End of namespace OldDreamTools

///////////////////////////////////////////////////////////////////////////////
// Lint options
//
//lint -restore
//
///////////////////////////////////////////////////////////////////////////////

#endif //JETBYTE_TOOLS_WIN32_CRITICAL_SECTION_INCLUDED__

///////////////////////////////////////////////////////////////////////////////
// End of file
///////////////////////////////////////////////////////////////////////////////
